/**
 * 定义 common 模块
 */
layui.define(['layer', 'base', 'network'], function(exports){
	var $ = layui.$
		,layer 		= layui.layer
		,base		= layui.base			// 基础模块
		,network 	= layui.network;		// 网络模块
		
	var common_api = {
		doc: $(document),
		
		/**
		 * 初始化
		 */
		initialize: function(response={}){
			// 路由信息
			var self_router = common_api.data.get('router.self_router');
			
			// 获取公共信息
			if(!common_api.isset(response) || !common_api.isObject(response)){
				base.ajax({
					url: CONFIG.URL_MAP.INDEX.COMMON,
					data: {
						node_name: common_api.isset(self_router) ? self_router : CONFIG.URL_MAP.INDEX.HOME,
					},
					async: false
				},{
					success: function(response){
						common_api._initialize(response);
					}
				});
			}else{
				common_api._initialize(response);
			}
		},
		
		/**
		 * 内部初始化
		 */
		_initialize: function(response){
			//console.log(response);
			switch(typeof response){
				case 'object':
					// 路径信息
					var path_info = common_api.isset(response.path) ? response.path : (common_api.isset(response.result.path) ? response.result.path : []);
					//console.log(path_info);
					
					var tpl_data = {
						home_url: CONFIG.URL_MAP.INDEX.HOME 	// 系统首页url
						,home_name: LANG.TEMPLATE.CONTENT.HOME	// 首页名称
						,path_info: path_info
					};
					
					// 导航
					common_api.template('breadcrumbs_tpl', tpl_data, 'breadcrumbs');
				break;
				case 'string':
					
				break;
			}
		},
		
		/**
		 * 设置 url
		 * @param Array urls[]
		 * @param String tag_id 		标签ID属性；如 tag-id="verify"、id="verify";中的：tag-id 或 id
		 * @param String id_value		标签ID属性值；如 tag-id="verify"、id="verify";中的：verify
		 * @param String|Array key		要设置的标签属性；如 src、href
		 * @param String value			标签属性值；如 Index/index
		 * @param String ext			url后缀扩展；如 html
		 * @param Object params			url参数
		 * @return 
		 */
		set_url: function(urls){
			var urls = typeof(urls)!='object' ? []:urls;
			
			$.each(urls, function(k, v){
				// 获取标签对象
				var tag = null;
				switch(v.tag_id){
					case 'class':
						tag = common_api.doc.find('.'+v.id_value);
					break;
					case 'id':
						tag = common_api.doc.find('#'+v.id_value);
					break;
					default:
						tag = common_api.doc.find('['+v.tag_id+'="'+v.id_value+'"]');
					break;
				}
				
				// 获取url
				var url = base.get_api_url(v.value, v.params, v.ext);
				
				// 设置标签属性
				if(typeof(v.key) == 'object'){
					$.each(v.key, function(a_k, a_v){
						tag.attr(a_v, url);
					});
				}else{
					tag.attr(v.key, url);
				}
			});
		},
		
		/**
		 * 设置语言
		 * @param String lang	语言类型
		 */
		setLang: function(lang='zh-cn'){
			base.data.set('lang', {
				now_lang: lang
			});
		},
		
		/**
		 * 获取当前语言
		 * @return String 
		 */
		getLang: function(){
			return base.data.get('lang.now_lang');
		},
		
		/**
		 * 获取语言包列表
		 * @return Array
		 */
		getLangList: function(){
			var langs = [];
			if('undefined' == CONFIG.LANGUAGES){ return langs;}
			
			$.each(CONFIG.LANGUAGES, function(k, v){
				switch(v.toLowerCase()){
					// 简体中文
					case 'zh-cn':
						langs[k] = {name:'zh-cn', title: LANG.TEMPLATE.HEADER.LANG_CN, icon: ''};
					break;
					// 英文
					case 'en-us':
						langs[k] = {name:'en-us', title: LANG.TEMPLATE.HEADER.LANG_EN, icon: ''};
					break;
				}
			})
			return langs;
		},
		
		/**
		 * 语言切换
		 */
		langSwap: function(){
			var _this = $(this);
			var lang = _this.attr('id');
			
			// 切换API语言
			common_api.ajax({
				url: CONFIG.URL_MAP.INDEX.LANG_SWAP,
				data:{
					node_name: common_api.data.get('router.self_router'),
					l: lang
				}
			}, {
				success: function(response){
					// 成功提示
					layer.msg(response.result.tips, {
						offset: 't',
						success:function(){
							setTimeout(function(){
								// 切换本地语言
								common_api.setLang(lang);
								window.location.reload();
							}, 1000);
						}
					});
				}
			});
		},
		
		/**
		 * 绑定事件
		 * @param Array events		事件列表
		 * @param String events.event_selector		事件选择器;id、class
		 * @param String events.event_name			事件名称
		 * @param String events.event_type			事件类型;click、change
		 * @param String events.event_func			事件方法
		 */
		bindEvents: function(events=[]){
			if(!common_api.isset(events)){
				return ;
			}
			$.each(events, function(k, v){
				var event_flag = '#'+v.event_name;
				// 选择器
				switch(v.event_selector){
					// $("#test")
					case 'id':
						event_flag = '#'+v.event_name;
					break;
					// $("#class")
					case 'class':
						event_flag = '.'+v.event_name;
					break;
					// $('[event-selector="event_name"]')
					default:
						event_flag = '['+v.event_selector+'="'+v.event_name+'"]';
					break;
				}
				
				// 监听事件
				common_api.doc.on(v.event_type, event_flag, v.event_func);
			});
		},
		
		/**
		 * 请求
		 * @param Object argvs					请求参数
		 * @param String argvs.url				请求URL
		 * @param String argvs.params			请求参数
		 * @param String argvs.render_id		渲染内容区域ID
		 * @param String argvs.callback			请求完成回调函数
		 */
		request: function(argvs){
			argvs._this 		= common_api.isset(argvs._this) ? argvs._this : $(this);
			// 请求地址
			argvs.url 			= common_api.isset(argvs.url) ? argvs.url : argvs._this.attr('url');
			// 请求参数
			argvs.params 		= common_api.isset(argvs.params) ? argvs.params : argvs._this.attr('params');
			// 回调函数
			argvs.callback		= common_api.isset(argvs.callback) ? argvs.callback : argvs.url.replace('/', '.').toLowerCase();
			// 模板地址
			var tpl_url 		= base.get_tpl_url(argvs.url);
			// 渲染区域
			var render			= common_api.isset(argvs.render_id) ? argvs.render_id : common_api.doc.find("#main_content");
			
			// 模板加载结果
			var result 	= false;
			
			// 拼接请求参数
			if(common_api.isset(argvs.params)) tpl_url += '&'+argvs.params;
			
			// 加载框ID
			var tpl_load_id = null;
			$.ajax({
				url:tpl_url,
				async: false,
				dataType: 'html',
				beforeSend: function(){
					// 初始化内容区域
					render.html("");
			
					// 弹出正在请求提示
					tpl_load_id = layer.msg(LANG.LOAD.ING, {
						icon: 16,
						shade: 0.01,
						time: 1000 * 30
					});
				},
				complete:function(){
					/**
					 * 弹出请求完成
					 * 1.关闭加载层
					 */
					
					// 1.关闭加载层
					if(base.isset(tpl_load_id)) layer.close(tpl_load_id);
				},
				success:function(response){
					// 加载模板到页面
					render.html(response);
					// 模板结果
					result = response;
					
					// 执行回调函数
					if(common_api.isset(argvs.callback)){
						common_api.requestCallback(argvs.callback, response);
					}
				},
				error: function(XMLHttpRequest, textStatus, errorThrown){
					// 错误信息
					var error_msg = LANG.RESPONSE.ERROR;
					
					// 返回状态
					switch(XMLHttpRequest.status){
						// 请求不存在
						case 404:
							error_msg = XMLHttpRequest.status + "：" + LANG.RESPONSE.NOT_FOUND;
						break;
					}
					
					// 提示错误
					layer.msg('<i class="icon-remove" style="color:red;"> '+error_msg+'</i>',{
						icon: 5,
						offset: 't',
						timeout: 2000
					});
					
					// 页面加载错误信
					var error_content = LANG.RESPONSE.TEMPLATE_ERROR + '<span style="color:red;margin:0px 10px 0px 0px;">' + tpl_url + '</span>' + XMLHttpRequest.responseText;
					render.html(error_content);
				}
			});
			
			return result;
		},
		
		/**
		 * 请求回调函数
		 * @param String func_name		函数名称
		 * @param Object result			数据集
		 */
		requestCallback: function(func_name='', result={}){
			try{
				var response_hander = 'network.response.'+func_name+'(result)';
				//console.log(response_hander);
				eval(response_hander);
			}catch(err){
				console.warn(err);
			};
		},
		
		// 路由
		router: {
			/**
			 * 路由追踪
			 */
			track: function(e){
				var _this = $(this);
				// 全部路由项，取消选择
				common_api.doc.find('.event-router-track').parent('li').removeClass('active');
				// 当前路由选中
				_this.parent('li').addClass('active');
				// 当前路由
				var self_router = _this.attr('url');
				// 保存当前路由到本地路由缓存
				base.data.set('router', {
					self_router: common_api.isset(self_router) ? self_router : ''
				});
			},
			
			/*
			 * 初始化路由追踪
			 */
			initTrack: function(){
				// 当前路由信息
				var self_router = base.data.get('router.self_router');
				
				if(common_api.isset(self_router)){
					// 当前路由项目
					var self_router_item = $('[url="'+self_router+'"]');
					// 祖先ID
					var first_parents_id = base.isset(self_router_item.attr('data-first-parents-id')) ? self_router_item.attr('data-first-parents-id').split('-') : [];
					$.each(first_parents_id, function(i, v) {
						// 展开菜单
						$('[data-node-id="'+v+'"]').addClass('open');
						$('[data-node-id="'+v+'"]').find('ul').first().css('display', 'block');
					});
					// 请求当前路由数据
					$('[url="'+self_router+'"]').click();
				}
			}
			
			// router 成员函数...
		},
		
		/**
		 * 菜单初始化
		 */
		meunInit: function(){
			// 全部路由项，取消选择
			common_api.doc.find('#system-menu .submenu').css('display', 'none');
			common_api.doc.find('#system-menu li').removeClass('open');
			common_api.doc.find('#system-menu li').removeClass('active');
		}
		// 成员函数...
	};
	
	// 继承base模块
	if(!Object.assign){
		$.extend(common_api, base, common_api);
	}else{
		common_api = Object.assign(base, common_api);
	}
	
	// 输出
	exports('common', common_api);
});
